雜貨店小劇場 2.0 —— 進貨、退貨與庫存閾值
👨🍳 劇情:
今天雜貨舖特別忙,不僅有老顧客來買東西,補貨員也想問問「哪些貨快賣完了」。你想用程式幫忙自動檢查哪些商品需要補貨,這樣就不會等到賣光才發現沒庫存啦!
重點功能
• 進貨:顧客買東西就加庫存(AddItem)
• 退貨:顧客退貨就扣庫存(RemoveItem)
• 庫存低於某個數量,自動提示「該補貨了!」(CheckAndAlert)
package main
import (
"fmt"
)
func Units() map[string]int {
return map[string]int{
"quarter_of_a_dozen": 3,
"half_of_a_dozen": 6,
"dozen": 12,
"small_gross": 120,
"gross": 144,
"great_gross": 1728,
}
}
func NewBill() map[string]int { return map[string]int{} }
func AddItem(bill, units map[string]int, item, unit string) bool {
qty, ok := units[unit]
if !ok { return false }
bill[item] += qty
return true
}
func RemoveItem(bill, units map[string]int, item, unit string) bool {
qty, ok := units[unit]
if !ok { return false }
current, exists := bill[item]
if !exists { return false }
if current < qty { return false }
if current == qty {
delete(bill, item)
} else {
bill[item] -= qty
}
return true
}
// 檢查某商品是否需要補貨(低於 threshold 回傳 true)
func CheckAndAlert(bill map[string]int, item string, threshold int) bool {
qty, exists := bill[item]
return exists && qty < threshold // 若有此商品且數量低於閾值就該補貨了!
}
func main() {
units := Units()
bill := NewBill()
// 進貨劇情
fmt.Println("=== 顧客 A 買了 2 打蘋果 ===")
AddItem(bill, units, "apple", "dozen")
AddItem(bill, units, "apple", "dozen")
fmt.Println("蘋果庫存:", bill["apple"]) // 24
// 退貨劇情
fmt.Println("\n=== 顧客 B 退 1 打蘋果 ===")
RemoveItem(bill, units, "apple", "dozen")
fmt.Println("蘋果剩餘:", bill["apple"]) // 12
// 檢查是否需要補貨(低於 15 通知)
if CheckAndAlert(bill, "apple", 15) {
fmt.Println("警告:蘋果剩", bill["apple"], "個,快補貨!")
} else {
fmt.Println("蘋果庫存足夠,不需補貨。")
}
// 換香蕉再試一次
fmt.Println("\n=== 顧客 C 買 1 半打香蕉 ===")
AddItem(bill, units, "banana", "half_of_a_dozen")
fmt.Println("香蕉庫存:", bill["banana"]) // 6
if CheckAndAlert(bill, "banana", 10) {
fmt.Println("警告:香蕉剩", bill["banana"], "根,快補貨!")
}
}